<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <script>
    // 汽车工厂
    var VehicleFactory = function(subType, superType) {
        // 判断抽象工厂中是否有该抽象类
        if (typeof VehicleFactory[superType] === 'function') {
            // 缓存类
            function F() {};
            // 继承父类属性和方法 => new VehicleFactory['Car']()
            F.prototype = new VehicleFactory[superType]();
            // 将子类constructor指向子类(这行代码目前不起作用，不理解意思)
            subType.constructor = subType;
            // 子类原型继承父类
            subType.prototype = new F();
        } else {
            throw new Error('未创建该抽象类');
        }
    }
    // 小汽车抽象类
    VehicleFactory.Car = function() {
        this.type = 'car';
    }
    VehicleFactory.Car.prototype = {
        getPrice: function() {
            return new Error('抽象方法不能用');
        },
        getSpeed: function() {
            return new Error('抽象方法不能用');
        }
    }
    // 公交车抽象类
    VehicleFactory.Bus = function() {
        this.type = 'bus';
    }
    VehicleFactory.Bus.prototype = {
        getPrice: function() {
            return new Error('抽象方法不能用');
        },
        getSpeed: function() {
            return new Error('抽象方法不能用');
        }
    }
    // 货车抽象类
    VehicleFactory.Truck = function() {
        this.type = 'truck';
    }
    VehicleFactory.Truck.prototype = {
        getPrice: function() {
            return new Error('抽象方法不能用');
        },
        getSpeed: function() {
            return new Error('抽象方法不能用');
        }
    }
    // 宝马汽车子类
    var BMW = function(price, speed) {
        this.price = price;
        this.speed = speed;
    }
    // 抽象工厂实现对Car抽象类的继承
    VehicleFactory(BMW, 'Car');
    BMW.prototype.getPrice = function() {
        return this.price;
    }
    BMW.prototype.getSpeed = function() {
        return this.speed;
    }
    console.log(BMW);
    var bmw = new BMW(200000, 340);
    console.log(bmw);
    bmw.getPrice();
    bmw.getSpeed();
    </script>
</body>

</html>